import tensorflow.examples.tutorials.mnist.input_data as input_data
import tensorflow as tf

# 使用softmax回归算法进行MNIST

mnist = input_data.read_data_sets('data_mnist', one_hot=True)

# 初始化计算图
sess = tf.InteractiveSession()

# 定义计算图的占位符
x = tf.placeholder("float", shape=[None, 784])
y_ = tf.placeholder("float", shape=[None, 10])

# 定义计算图的变量
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# 计算图的变量初始化
sess.run(tf.global_variables_initializer())

# 我们把向量化后的图片x和权重矩阵W相乘，加上偏置b，然后计算每个分类的softmax概率值。
y = tf.nn.softmax(tf.matmul(x, W) + b)

# 指定最小化误差用的损失函数，我们的损失函数是目标类别和预测类别之间的交叉熵。
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

# 用最速下降法让交叉熵下降，步长为0.01.
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# train_step操作对象，在运行时会使用梯度下降来更新参数。因此，整个模型的训练可以通过反复地运行train_step来完成。
for i in range(1000):
    batch = mnist.train.next_batch(50)
    sess.run(train_step, feed_dict={x: batch[0], y_: batch[1]})
    # train_step.run(feed_dict={x: batch[0], y_: batch[1]})

# 给出某个tensor对象在某一维上的其数据最大值所在的索引值
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# 为了计算我们分类的准确率，我们将布尔值转换为浮点数来代表对、错，然后取平均值。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

# 计算出在测试数据上的准确率
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
# print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

sess.close()
